def fun1(a, b, c):
    print(a, b, c, sep='###')  # 关键字参数传递

# 1.位置参数传递
fun1(1, 2, 3)
# 2.关键字参数传递
fun1(c = 3, a = 1, b = 2)
fun1(1, 2, c = 3)

# 3.默认参数的定义和传递
def fun2(name, age, sex='男'):
    print(f'姓名:{name}, 年龄:{age}, 性别:{sex}')
fun2('张三', 21, '女')
fun2(name='李四', age=18)  # sex不传递，使用参数的默认值

# 4.仅限位置
def fun3(a, b, /,c):
    print(a, b, c, sep='###')

fun3(1, 2, 3)
# fun3(a = 3, b = 5, c = 6)  # /之前的参数只能使用位置参数传递
fun3(3, 5, c = 6)

# 5.参数的打包和解包
# 打包：传递可变参数（多个值、多个键值对组合）封装成一个元组/字典
# 传递可变参数封装成元组类型
# 元组的变量名称通常是args
# 元组(*参数)可变参数在方法只能定义一次
def add(*args):
    # print(args)
    # print(type(args))
    total = 0
    for item in args:
        total += item
    return total

# print(add(1, 2))  # 3
# print(add(1, 3, 5))  # 9
print(add())  # 可以不传参数，args是一个空元组

x = (4, 5, 6)
# print(add(x))  # 不能传递元组整体
print(add(*x))  # 解包

print('=' * 50)
# 接收可变键值对封装成字典类型
def print_user(**kwargs):
    print(kwargs)
    print(type(kwargs))

print_user(name='张三', age=18, sex='男', hobby=['打游戏', '跑步'])
print_user(name='李四', sex='男', phone='15588889999')
print_user()

x = { 'name': '张三', 'age': 20 }
# print_user(x)  # 不能传一个字典变量，应该把字典散开成一个个键值对
print_user(**x)  # 解包